/**
 * 垃圾回收(GC)
 */

var obj = new Object();
// do something...

// 垃圾回收
// 1. js中的内存管理是自动执行的，而且是不可见的。我们创建基本类型、对象、函数……所有这些都需要内存
// 2. 引擎中有一个后台进程称为垃圾回收器，它监视所有对象，并删除那些不可访问的对象
// 示例
var user = {
    name: 'John'
};
// 3. 如果 user 的值被覆盖，则引用丢失, 后台进程会将user重置, 即user = null
// 4. 这个时候user变成不可访问状态且没有对它的引用, 垃圾回收器会丢弃John并释放内存



// 内部算法:
// 基本的垃圾回收算法称为“标记-清除”，定期执行以下“垃圾回收”步骤:
//  1. 垃圾回收器获取根并“标记”(记住)它们。
//  2. 然后它访问并“标记”所有来自它们的引用。
//  3. 然后它访问标记的对象并标记它们的引用。所有被访问的对象都被记住，以便以后不再访问同一个对象两次。
//  4. 以此类推，直到有未访问的引用(可以从根访问)为止。
//  5. 除标记的对象外，所有对象都被删除
//  6. 并在该基础上做了一些优化
//      分代回收——对象分为两组:“新对象”和“旧对象”。许多对象出现，完成它们的工作并迅速结 ，它们很快就会被清理干净。那些活得足够久的对象，会变“老”，并且很少接受检查。
//      增量回收——如果有很多对象，并且我们试图一次遍历并标记整个对象集，那么可能会花费一些时间，并在执行中会有一定的延迟。因此，引擎试图将垃圾回收分解为多个部分。然后，各个部分分别执行。这需要额外的标记来跟踪变化，这样有很多微小的延迟，而不是很大的延迟。
//      空闲时间收集——垃圾回收器只在 CPU 空闲时运行，以减少对执行的可能影响



// 参考博客：https://segmentfault.com/a/1190000018605776
